package com.nidu.demo.file.ability;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.cola.exception.BizException;
import com.nidu.demo.common.exception.ErrorCodeConstants;
import com.nidu.demo.file.gateway.FileConfigGateway;
import com.nidu.demo.file.model.FileConfig;
import com.nidu.demo.file.model.FileConfigCriteria;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Component
@RequiredArgsConstructor
public class FileConfigDomainService {

    private final FileConfigGateway fileConfigGateway;

    /**
     * 获取当前租户的主要文件配置
     *
     * @return 文件配置
     */
    public FileConfig getConfig() {
        List<FileConfig> configs = fileConfigGateway.listByCondition(new FileConfigCriteria());
        if (configs.isEmpty()) {
            throw new BizException(ErrorCodeConstants.FILE_CONFIG_TENANT_NOT_FOUND.getCode(), ErrorCodeConstants.FILE_CONFIG_TENANT_NOT_FOUND.getMessage());
        }

        List<FileConfig> masters = configs.stream().filter(FileConfig::getMaster).collect(Collectors.toList());
        if(CollUtil.isEmpty(masters)){
            // 租户没有主文件配置，使用第一个可用配置
            return configs.get(0);
        }
        return masters.get(0);
    }

    /**
     * 根据存储类型获取当前租户的文件配置
     *
     * @param storageType 存储类型
     * @return 文件配置
     */
    public FileConfig getConfigByType(Integer storageType) {

        FileConfigCriteria fileConfigCriteria = new FileConfigCriteria();
        fileConfigCriteria.setStorage(storageType);
        List<FileConfig> configs = fileConfigGateway.listByCondition(fileConfigCriteria);
        if (configs.isEmpty()) {
            throw new BizException(ErrorCodeConstants.FILE_CONFIG_TENANT_NOT_FOUND.getCode(), ErrorCodeConstants.FILE_CONFIG_TENANT_NOT_FOUND.getMessage());
        }

        List<FileConfig> masters = configs.stream().filter(FileConfig::getMaster).collect(Collectors.toList());
        if(CollUtil.isEmpty(masters)){
            // 租户没有主文件配置，使用第一个可用配置
            return configs.get(0);
        }
        return masters.get(0);
    }
}
